#include <iostream>

#include "conta_simples.h"
#include "conta_exception.h"
//-------------------------------------------------------------------
/*!
 * @fn conta_simples::conta_simples( unsigned long num_conta, double saldo )
 * @brief construtor padrão
 */
conta_simples::conta_simples( unsigned long num_conta, double saldo )
: ul_numero_conta(num_conta)
, d_saldo(saldo)
{
}
//-------------------------------------------------------------------
/*!
 * @fn conta_simples::~conta_simples( void )
 * @brief destrutor padrão
 */
conta_simples::~conta_simples( void )
{
}
//-------------------------------------------------------------------
/*!
 * @fn bool conta_simples::deposito( double valor )
 * @brief realiza deposito no saldo atual
 * @param valor montante para depósito
 * @return true para depósito ok ou false para erro
 */
bool conta_simples::deposito( double valor )
{
    bool bln_result = false;

    try {
        if ( valor ) {
            this->d_saldo += valor;
            std::cout << "Conta: " << this->ul_numero_conta << ": Depositado R$" << valor << std::endl;
            bln_result = true;
        } else 
            throw conta_exception("valor do montante para depósito deve ser maior que zero.");
    } catch ( std::exception& e ) {
        std::cerr << e.what() << std::endl;
    }

    return (bln_result);
}
//-------------------------------------------------------------------
/*!
 * @fn bool conta_simples::saque( double valor )
 * @brief realize saque na conta atual, caso houver montante
 * @param valor montante para saque
 * @return true para saque realizado, false para erro
 */
bool conta_simples::saque( double valor )
{
    bool bln_result = false;

    try {
        if ( (valor <= this->d_saldo) && (valor) ) {
            this->d_saldo -= valor;
            std::cout << "Conta " << this->ul_numero_conta << ": sacado R$" << valor << std::endl;
            bln_result = true;
        } else
            throw conta_exception("Não foi possível realizar o saque");
    } catch ( std::exception& e ) {
        std::cerr << e.what() << std::endl;
    }

    return (bln_result);
}
//-------------------------------------------------------------------
/*!
 * @fn bool conta_simples::transferir( double valor, conta_simples& fornecido )
 * @brief Transfere valor da conta atual para outra conta
 * @param valor Valor desejado para tranferencia
 * @param fornecido Conta alvo para receber o valor
 * @return resultado da transferencia
 */
bool conta_simples::transferir( double valor, conta_simples& fornecido )
{
    bool bln_result;
    
    try {
        if ( (bln_result = this->saque(valor)) == true )
            if ( fornecido.deposito(valor) == true ) {
                std::cout << "Conta: " << this->ul_numero_conta << ": transefirido R$" << valor << " para conta " << fornecido.get_conta() << std::endl;
                bln_result = true;
            }
        else
          throw conta_exception("Não pode realizar transferencia.");
    } catch ( std::exception& e ) {
        std::cerr << e.what() << std::endl;
    }

    return (bln_result);
}
//-- EOF - conta_simples.cpp ----------------------------------------
